﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;
using System.Collections;

namespace clonegame
{
    public partial class formularioReportes : UserControl
    {
        private static readonly formularioReportes instancia = new formularioReportes();
        public static formularioReportes Instancia
        {
            get { return instancia; }
        }

        // Lista de reportes
        private ArrayList lista;

        private string estado = "editar";
        private bool cambio;

        private int rowsPaginas;
        public int RowsPaginas
        {
            get { return rowsPaginas; }
            set { rowsPaginas = value; }
        }

        private int pagina;
        public int Pagina
        {
            get { return pagina; }
            set { pagina = value; }
        }

        /// <summary>
        /// Constructor.
        /// </summary>
        public formularioReportes()
        {
            InitializeComponent();

            cambio = true;
            estado = "editar";
            pagina = 1;
            rowsPaginas = 5;

            MuestraForm(formularioReporteEditar.Instancia);
        }

        /// <summary>
        /// Al cargar el formulario se rellena la lista de reportes.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void formularioReportes_Load(object sender, EventArgs e)
        {
            // Cogemos la información de la base de datos y la metemos en el dgv
            // Para ello usaremos una función auxiliar que nos será útil para llamarla desde otros lugares.
            if (cambio)
            {
                RellenaDGV(false, pagina, rowsPaginas);
                cambio = false;
            }
        }

        /// <summary>
        /// Rellena el DGV de reportes con la información de los reportes que hay en la base de datos.
        /// </summary>
        /// <param name="lista">Lista de reportes a buscar.</param>
        public void RellenaDgvBuscar(ArrayList lista)
        {
            int numFilas = 0;
            dgvReportes.Rows.Clear();
            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            int i = 0;
            foreach (ENReporte re in lista)
            {
                if (i == 0)
                {
                    if (re != null)
                    {
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioReporteEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioReporteEditar.Instancia.cargarDatos(re.Fecha.ToString(), re.NAtacante.ToString(), re.NDefensor.ToString(), re.NGanador.ToString(), re.AtaqueA.ToString(), re.DefensaA.ToString(), re.AtaqueD.ToString(), re.DefensaD.ToString(), re.Texto.ToString());
                    }
                }
                i++;
                dgvReportes.Rows.Add(1);

                dgvReportes.Rows[numFilas].Cells[0].Value = re.Fecha.ToString();
                dgvReportes.Rows[numFilas].Cells[1].Value = re.NGanador.ToString();
                numFilas++;
            }
        }

        /// <summary>
        /// Rellena el DGV de reportes con la información de los reportes que hay en la base de datos.
        /// </summary>
        /// <param name="nuevo">Muestra si reportes es nuevo o no.</param>
        /// <param name="pagina">Pagina reportes.</param>
        /// <param name="tamano">Tamano.</param>
        public void RellenaDGV(bool nuevo, int pagina, int tamano)
        {
            int numFilas = 0;
            lista = CADReporte.Instancia.getReportes();
            dgvReportes.Rows.Clear();

            int i = 0;
            foreach (ENReporte re in lista)
            {
                if (i == 0 && nuevo == false)
                {
                    if (re != null)
                    {
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioReporteEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioReporteEditar.Instancia.cargarDatos(re.Fecha.ToString(), re.NAtacante.ToString(), re.NDefensor.ToString(), re.NGanador.ToString(), re.AtaqueA.ToString(), re.DefensaA.ToString(), re.AtaqueD.ToString(), re.DefensaD.ToString(), re.Texto.ToString());
                    }
                }
                i++;
                dgvReportes.Rows.Add(1);

                dgvReportes.Rows[numFilas].Cells[0].Value = re.Fecha.ToString();
                dgvReportes.Rows[numFilas].Cells[1].Value = re.NGanador.ToString();
                numFilas++;
            }
        }

        /// <summary>
        /// Muestra formulario.
        /// </summary>
        /// /// <param name="u">Control usuario formulario.</param>
        public void MuestraForm(UserControl u)
        {
            pReportes.Controls.Clear();
            pReportes.Controls.Add(u);
            u.Dock = DockStyle.Fill;
        }

        /// <summary>
        /// Muestra el panel para crear un nuevo reporte.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void btAnadir_Click(object sender, EventArgs e)
        {
            formularioReporteEditar.Instancia.BorraForm();

            if (estado != "editar")
            {
                MuestraForm(formularioReporteEditar.Instancia);
            }
        }

        /// <summary>
        /// Elimina reportes seleccionados.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void btEliminar_Click(object sender, EventArgs e)
        {
            ArrayList seleccionados = new ArrayList();
            int seleccionadas = dgvReportes.SelectedRows.Count;

            if (seleccionadas < 1)
            {
                MessageBox.Show("Debe seleccionar algun reporte primero.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
            }
            else if (seleccionadas == 1)
            {
                string fecha = dgvReportes.SelectedRows[0].Cells[0].Value.ToString();
                if (MessageBox.Show("¿Desea eliminar el reporte con fecha " + fecha + "?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    CADReporte.Instancia.EliminaReporte(dgvReportes.SelectedRows[0].Cells[0].Value.ToString());
                    RellenaDGV(false, pagina, rowsPaginas);

                    ENActividad act = new ENActividad();
                    act.Accion = "Baja";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha dado de baja el reporte con fecha " + fecha + ".";
                    act.Fecha = DateTime.Now.ToString();
                    CADActividad.Instancia.InsertarActividad(act);
                }
            }
            else
            {
                if (MessageBox.Show("¿Desea eliminar " + seleccionadas + " reportes?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    foreach (DataGridViewRow r in dgvReportes.SelectedRows)
                    {
                        CADReporte.Instancia.EliminaReporte(r.Cells[0].Value.ToString());
                    }

                    RellenaDGV(false, pagina, rowsPaginas);

                    ENActividad act = new ENActividad();
                    act.Accion = "Baja";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha dado de baja " + seleccionadas + " reportes.";
                    act.Fecha = DateTime.Now.ToString();
                    CADActividad.Instancia.InsertarActividad(act);
                }
            }
            // Actualizamos el DGV de bienvenida.
            formularioBienvenida.Instancia.actualizaResumen();
        }

        /// <summary>
        /// Selecciona reportes mostrando su informacion.
        /// </summary>
        /// <param name="sender">Objeto que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
       private void dgvReportes_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                formularioReporteEditar.Instancia.dtpFecha.Enabled = false;

                // Obtenemos la información reporte.
                string fecha = dgvReportes.Rows[e.RowIndex].Cells[0].Value.ToString();
                formularioReporteEditar.Instancia.Re = CADReporte.Instancia.getReporte(fecha);

                ENReporte re = formularioReporteEditar.Instancia.Re;

                // Comprobamos si el reporte existe.
                if (re != null)
                {
                    // Pasamos al estado de edición.
                    estado = "editar";

                    // Cargamos el formulario de edición.
                    MuestraForm(formularioReporteEditar.Instancia);

                    // Completamos la información del formulario.
                    formularioReporteEditar.Instancia.cargarDatos(re.Fecha.ToString(), re.NAtacante.ToString(), re.NDefensor.ToString(), re.NGanador.ToString(), re.AtaqueA.ToString(), re.DefensaA.ToString(), re.AtaqueD.ToString(), re.DefensaD.ToString(), re.Texto.ToString());
                }
                else
                {
                    // Mostramos un error.

                }
            }
        }

       /// <summary>
       /// Atajo teclado suprimir.
       /// </summary>
       /// <param name="sender">Objeto que envía la acción.</param>
       /// <param name="e">Argumentos.</param>
       private void dgvReportes_KeyUp(object sender, KeyEventArgs e)
       {
           if (e.KeyValue == 46)
           {
               EventArgs ea = null;
               btEliminar_Click(sender, ea);
           }
       }

       /// <summary>
       /// Atajo teclado suprimir.
       /// </summary>
       /// <param name="sender">Objeto que envía la acción.</param>
       /// <param name="e">Argumentos.</param>
       private void formularioReportes_KeyUp(object sender, KeyEventArgs e)
       {
           if (e.KeyValue == 46)
           {
               EventArgs ea = null;
               btEliminar_Click(sender, ea);
           }
       }
    }
}
